package services;

import java.util.ArrayList;
import java.util.List;

import models.CalificacionPeriodo;
import models.Curso;
import models.Estudiante;
import models.Materia;
import models.MateriaCurso;
import models.MateriaGrado;
import models.Persona;
import util.Queries;

public class ProfesorSrv {

	public static List<CalificacionPeriodo> getCalificacionesPeriodo(
			Long idMateria, Long idCurso, Long idPeriodo) {
		System.out
				.println("alskdjalskjdaslkdjalskdjlaskjdlaksdjalskdjlaskjdlakjdlakjdlaksjkdj");
		List<Object[]> os = DAO.executeNamed(
				CalificacionPeriodo.CALIFICACIONES_CORTE, -1, "idMateria",
				idMateria, "idCurso", idCurso, "idPeriodo", idPeriodo);
		Long idGrado = DAO.find(Curso.class, idCurso).getIdGrado();

		List<CalificacionPeriodo> cs = new ArrayList<CalificacionPeriodo>();
		for (Object[] o : os) {
			// e.id,p.apellidos, p.nombres,cc.nota

			CalificacionPeriodo cc = new CalificacionPeriodo((Long) o[0],
					idPeriodo, idMateria, idGrado, (String) o[3]);
			Estudiante e = new Estudiante();
			Persona p = new Persona();
			e.setPersona(p);
			p.setApellidos(o[1].toString());
			p.setNombres(o[2].toString());
			cc.setEstudiante(e);
			cs.add(cc);
		}

		return cs;
	}

	public static List<CalificacionPeriodo> getCalificacionesPeriodos(
			Long idMateria, Long idCurso, Long idCalendarioAcademico,
			Long idPeriodo) {
		List<Object[]> os = DAO.executeNamed(
				CalificacionPeriodo.CALIFICACIONES_CORTE, -1, "idMateria",
				idMateria, "idCurso", idCurso, "idPeriodo", idPeriodo);
		Long idGrado = DAO.find(Curso.class, idCurso).getIdGrado();

		List<CalificacionPeriodo> cs = new ArrayList<CalificacionPeriodo>();
		for (Object[] o : os) {
			// e.id,p.apellidos, p.nombres,cc.nota

			CalificacionPeriodo cc = new CalificacionPeriodo((Long) o[0],
					idPeriodo, idMateria, idGrado, (String) o[3]);
			Estudiante e = new Estudiante();
			Persona p = new Persona();
			e.setPersona(p);
			p.setApellidos(o[1].toString());
			p.setNombres(o[2].toString());
			cc.setEstudiante(e);
			cs.add(cc);
		}

		return cs;
	}

	public static List<MateriaCurso> getAsignaturasProfesor(Long idProfesor,
			Long idCalendarioAcademico) {
		List<Object[]> res = DAO.executeNamed(
				MateriaCurso.ASIGNATURAS_PROFESOR, -1, "idProfesor",
				idProfesor, "idCalendarioAcademico", idCalendarioAcademico);

		List<MateriaCurso> mcs = new ArrayList<MateriaCurso>();
		for (Object[] matCu : res) {
			MateriaCurso mc = (MateriaCurso) matCu[0];
			Materia m = (Materia) matCu[1];
			Curso c = (Curso) matCu[2];
			mc.setMateria(m);
			mc.setCurso(c);
			mcs.add(mc);
		}
		return mcs;
	}

	public static List<MateriaGrado> getMateriasGrado(
			Long idCalendarioAcademico, Long idProfesor) {

		List<Object[]> oo = DAO.executeNative(
				Queries.getMateriasGradoProfesor(), -1, "idProfesor",
				idProfesor, "idCalendarioAcademico", idCalendarioAcademico);
		List<MateriaGrado> res = new ArrayList<MateriaGrado>();
		for (Object[] o : oo)
			res.add(new MateriaGrado(((Number) o[0]).longValue(),
					((Number) o[1]).longValue(), ((Number) o[2]).longValue()));
		return res;
	}

	public static List<Estudiante> getEstudiantesCurso(Long idCurso) {

		return DAO.execute("SELECT e FROM Estudiante e "
				+ "JOIN Matricula m ON m.idEstudiante=e.id "
				+ "WHERE m.idCurso=:idCurso", -1, "idCurso", idCurso);
	}

}
